package com.alibaba.algo.dao.user;

import com.alibaba.algo.cooperation.feign.vo.req.*;
import com.alibaba.algo.cooperation.feign.vo.res.CheckRoleInfoResponseVO;
import com.alibaba.algo.cooperation.feign.vo.res.RoleBaseInfoResponseVO;
import com.alibaba.algo.cooperation.feign.vo.res.UserInfoResVO;
import com.alibaba.algo.cooperation.feign.vo.res.UserRoleInfoResVO;
import com.alibaba.algo.cooperation.usercomponent.vo.res.user.SelectRoleListResponseVO;
import com.alibaba.algo.core.base.BaseMapper;
import com.alibaba.algo.dtos.user.SysRoleUserDTO;
import com.alibaba.algo.dtos.user.SysUserDTO;
import com.alibaba.algo.entity.user.SysRole;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 类SysRoleMapper.java的实现描述：角色Mapper
 *
 * @author nieganggang 2021-03-12 16:08:17
 */
public interface SysRoleMapper extends BaseMapper<SysRole> {

    /**
     * 查询分页总数
     *
     * @param sysRole 入参
     * @return 总数
     */
    Integer countByPage(@Param("obj") SysRole sysRole);

    Integer permissionSelectCount(@Param("obj") SysRole sysRole);

    /**
     * 查询分页总数
     *
     * @param sysRole 入参
     * @return 总数
     */
    Integer countOrgRoleByPage(@Param("obj") SysRole sysRole);
    /**
     * 查询分页总数(查询全量或有效数据)
     *
     * @param sysRole 入参
     * @return 总数
     */
    Integer countByPageWithIsDeleted(@Param("obj") SysRole sysRole);

    /**
     * 分页查询角色列表
     *
     * @param sysRole 入参
     * @param start   分页开始
     * @param end     分页结束
     * @param sortMap 排序规则
     * @return 角色列表
     */
    List<SelectRoleListResponseVO> selectPage(@Param("obj") SysRole sysRole, @Param("start") int start, @Param("end") int end,
                                              @Param("sort") String sortMap);

    List<SelectRoleListResponseVO> permissionSelect(@Param("obj") SysRole sysRole, @Param("start") int start, @Param("end") int end,
                                                    @Param("sort") String sortMap);

    /**
     * 分页查询角色列表
     *
     * @param sysRole 入参
     * @param start   分页开始
     * @param end     分页结束
     * @param sortMap 排序规则
     * @return 角色列表
     */
    List<SelectRoleListResponseVO> selectOrgRolePage(@Param("obj") SysRole sysRole, @Param("start") int start, @Param("end") int end,
                                              @Param("sort") String sortMap);
    /**
     * 分页查询角色列表(查询全量或有效数据)
     *
     * @param sysRole 入参
     * @param start   分页开始
     * @param end     分页结束
     * @param sortMap 排序规则
     * @return 角色列表
     */
    List<SelectRoleListResponseVO> selectPageWithIsDeleted(@Param("obj") SysRole sysRole, @Param("start") int start, @Param("end") int end,
                                              @Param("sort") String sortMap);
    /**
     * 根据租户条件和组织条件查询用户
     *
     * @param vo
     * @return
     */
    List<SysUserDTO> selectUserByApp(@Param("param") SelectOrgUserReqVO vo);

    List<SysUserDTO> selectUserByAppDefaultAll(@Param("param") SelectOrgUserReqVO vo);

    List<SysUserDTO> selectUsersByOrg(@Param("param") SelectOrgUserReqVO vo);

    List<SysUserDTO> selectUsersByOrgDefaultAll(@Param("param") SelectOrgUserReqVO vo, @Param("start") int start, @Param("end") int end);

    List<UserInfoResVO> selectUsersByRole(@Param("param") GetRoleUserReqVO vo);

    List<UserInfoResVO> selectUsersWithIsDeletedByRole(@Param("param") GetRoleUserReqVO vo);
    /**
     * 根据角色清单，批量获取用户信息
     */
    List<SysRoleUserDTO> selectUsersByRoles(@Param("param") GetRoleUserReqVO vo);

    Long selectRoleIdByCode(@Param("roleCode") String roleCode, @Param("appCode") String appCode);

    void deleteById(@Param("id") Long id);

    void updateByIdWithIsDeleted(@Param("obj") SysRole sysRole);
    /**
     * Count记录数
     * @param vo
     * @return
     */
    Integer countUserPageByRoleCondition(@Param("param") SelectUserListByRoleReqVO vo);

    /**
     * 分页查询
     * @param vo
     * @return
     */
    List<UserRoleInfoResVO> selectUserPageByRoleCondition(@Param("param") SelectUserListByRoleReqVO vo,
                                                          @Param("start") int start,
                                                          @Param("end") int end,
                                                          @Param("sort") String sort);

    /**
     * 通过角色Id或Code查询角色基本详情
     * @param paramVO
     * @return
     */
    RoleBaseInfoResponseVO getRoleBaseInfoByIdOrCode(@Param("param") GetRoleBaseInfoReqVO paramVO);

    /**
     * 列表查询
     *
     * @param entity
     * @param sort
     * @return
     */
    List<SysRole> listByParaWithIsDeleted(@Param("obj") SysRole entity, @Param("sort") String sort);

    /**
     * 根据角色Code员工工号租户Code判断是否是该角色
     * @param paramVO
     * @return
     */
    List<CheckRoleInfoResponseVO> checkRoleByCodeAndEmployee(@Param("obj") RoleEmployeeReqVO paramVO);
}
